﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdio.h>
#include <limits.h>
// 博客素材
// 原题连接：https://www.nowcoder.com/practice/1a3de8b83d12437aa05694b90e02f47a?tpId=188&tqId=38634&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week&difficulty=2&judgeStatus=&tags=/question-ranking
// 题目描述：
/*
 给定一个32位的有符号整数num，将num中的数字部分反转，最后返回反转的结果
1.只反转数字部分，符号位部分不反转
2.反转后整数num超过 32 位的有符号整数的范围 [−231,  231 − 1] ，返回 0
3.假设本题不允许存储 64 位整数(有符号或无符号，即C++不能使用long long ，Java不能使用long等)

数据范围:
-2^31 <= x <= 2 ^31  - 1

**示例1**
输入：
12
返回值：
21

**示例2**
输入：
-123
返回值：
-321

**示例3**
输入：
10
返回值：
1

**示例4**
输入：
1147483649
返回值：
0
*/

// 方法——数学法
/*
思路：
先通过循环把数字的每一位拆开，在计算时候每一步都判断是否溢出，
若溢出就直接返回0，否则进行下一轮循环。
*/

// 有了以上思路，那我们写起代码来就水到渠成了
int reverse1(int x) {
	// 当x介于(-10, 10)之间时，反转后还是等于自身
	if (x > -10 && x < 10) {
		return x;
	}
	int ans = 0;
	while (x) {
		int next = x % 10;
		ans = ans * 10 + next;
		x /= 10;
	}
	// 进行判断
	if (ans < INT_MIN || ans > INT_MAX) {
		return 0;
	}
	return ans;
}

// 以上代码未能解决溢出问题
// 接下来给出正确解法
int reverse2(int x) {
	if (x > -10 && x < 10) {
		return x;
	}
	int ans = 0;
	while (x) {
		int next = x % 10;
		if (ans > INT_MAX / 10 || (ans == INT_MAX / 10 && next > 7)) {
			return 0;
		}
		else if (ans < INT_MIN / 10 || (ans == INT_MIN / 10 && next < -8)) {
			return 0;
		}
		ans = ans * 10 + next;
		x /= 10;
	}
	return ans;
}